<?php
class RegEx{
    public static function test(){
        $res = preg_match('//','995949180@qq.com');
        var_dump($res);
        die();
    }

    //判断是否为纯数字
    public static function isAllNum($num){
        $res = preg_match('/^[0-9]*$/',$num);
        if($res === 1){
            return true;
        }
        return false;
    }

    /**
     * 允许n位数字
     * @param integer $n
     * @param string $numStr
     */
    public static function allowNLengthNum($n,$numStr){
        $res = preg_match('/^\d{'.$n.'}$/',$numStr);
        if($res === 1){
            return true;
        }
        return false;
    }

    /**
     * 允许n位小数
     * @param $n
     * @param $number
     */
    public static function decimalPointN($n,$number){
        $res = preg_match('/^[0-9]+(.[0-9]{'.$n.'})?$/',$number);
        if($res === 1){
            return true;
        }
        return false;
    }

    /**
     * 统一社会信用代码
     * @param string $code
     */
    public static function RegExUnifiedSocialCreditCode($code = ""){
        $res = preg_match('/^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/',$code);
        if($res === 1){
            return true;
        }
        return false;
    }

    /**
     * 校验十五,十八位身份证号
     * @param $code
     */
    public static function IdCard($code){
        $res = preg_match('/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/',$code);
        if($res === 1){
            return true;
        }
        return false;
    }

    /**
     * 校验国际手机号
     * @param $code
     * @return bool
     */
    public static function phoneNumber($code){
        $res = preg_match('/^(00|\+)[1-9]{1}([0-9][\s]*){9,16}$/',$code);
        if($res === 1){
            return true;
        }
        return false;
    }

    /**
     * 校验国内手机号
     * @return bool
     */
    public static function phoneNumberChina($code){
        $res = preg_match('/^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$/',$code);
        if($res === 1){
            return true;
        }
        return false;
    }

    /**
     * 校验国内手机号码段
     * @return bool
     */
    public static function phoneNumberChina1($code){
        $res = preg_match('/^1[3456789]\d{9}$/',$code);
        if($res === 1){
            return true;
        }
        return false;
    }

    /**
     * 校验数字，字母，标点符号
     * @param $code
     * @return bool
     */
    public static function strNumberWordSymbol($code){
        $res = preg_match('/^[a-z_A-Z0-9-\.!@#\$%\\\^&\*\)\(\+=\{\}\[\]\/",\'<>~\·`\?:;|]+$/',$code);
        if($res === 1){
            return true;
        }
        return false;
    }

    /**
     * 字符连续出现 i 次
     * @param string $str
     * @param int $i
     * @return bool
     */
    public static function isOrderChar(string $str,int $i){
        $charArr = str_split($str);
        //字符转ascii
        foreach ($charArr as $k=>$v){
            $charArr[$k] = ord($v);
        }

        $len = count($charArr);
        $count = 0;
        $t = $charArr[0];

        for($j=1;$j<$len;$j++){
            if($charArr[$j] - $t == 1){
                $count += 1;
                if($count >= $i - 1){
                    return true;
                }
            }else{
                $count = 0;
            }
            $t = $charArr[$j];
        }
        return false;
    }

    /**
     * 字符不能连续出现 i 次
     * @param string $str
     * @param int $i
     * @return bool
     */
    public static function isRepeatChar(string $str,int $i){
        $charArr = str_split($str);
        //字符转ascii
        foreach ($charArr as $k=>$v){
            $charArr[$k] = ord($v);
        }

        $len = count($charArr);
        $count = 0;
        $t = $charArr[0];

        for($j=1;$j<$len;$j++){
            if($charArr[$j] - $t == 0){
                $count += 1;
                if($count >= $i - 1){
                    return true;
                }
            }else{
                $count = 0;
            }
            $t = $charArr[$j];
        }
        return false;

    }

    /**
     * 只能是数字字母
     * @param $code
     * @return bool
     */
    public static function strNumberWord($code){
        $res = preg_match('/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{12}$/',$code);
        if($res === 1){
            return true;
        }
        return false;
    }


    public static function httpProtocol($url){
        $res = preg_match('/(http|https):\/\/([\w.]+\/?)\S*/',$url);
        if($res === 1){
            return true;
        }
        return false;
    }

    /**
     * 判断是否为含有中文字符
     * @param $str
     */
    public static function issetCnStr($str){
        $res = preg_match_all('/[\x{4e00}-\x{9fa5}]+/u',$str);
        if($res === 1){
            return true;
        }
        return false;
    }

    //字符串不能包含中文
    public static function containChinese($str = "")
    {
        if (preg_match("/([\x81-\xfe][\x40-\xfe])/", $str, $match)) {
            // '含有汉字';
            return true;
        } else {
            // '不含有汉字';
            return false;
        }
    }


}